lpunbfandomcom-20200214-history
Seminário avaliação da linguagem - Lua
Lua é uma linguagem dinâmica de programação projetada para dar suporte a programação procedimental, oferecendo também uma facilidade para a descrição de dados. Ela oferece suporte a orientação a objetos, programação funcional e programação orientada a dados, sendo utilizada também por qualquer aplicação que linguagem de script leve. Integrantes - 1/2014 Caio Crivelente Diego Marques Matheus Andrade Histórico da linguagem A linguagem foi criada em 1993 por Roberto Ierusalimschy, Luiz Henrique de Figueiredo e Walemar Cales da PUC - Rio onde a partir da versão 5.0, foi licenciada sob a licença MIT. Lua é implementada como uma biblioteca, escrita por um subconjunto de ANSI C e C++, além, também de ter como referência as linguagens Icon, por sua concepção, e Python, por sua facilidade de utilização por não-programadores. Os criadores da linguagem também enfatizam que Scheme foram uma grande influência na decisão de desenvolver a tabela como a principal estrutura de dados, o que engloba uma de suas vantagens frente a legibilidade e capacidade de escrita. O primeiro projeto utilizando a linguagem em jogos, uma de suas principais aplicações, foi em 1997 no jogo Grim Fandango. Domínio - Principais aplicações Lua pode ser usada em arquivos de configuração ou inicialização do programa, delegando as preferências e listas de variáveis-valores. Com linguagens macros, ela pode automatizar tarefas, fazer uma lista de ações primitivas como automações de conexões via modem. Já em liguagens embutidas, ela permite o acesso programável aos serviços da aplicação, o seu controle de fluxo, as definições de funções e estruturas de dados como por exemplo inteligência artificial em jogos. Sua aplicação em jogos é o que mais se destaca, por ser uma linguagem de scripting, além de apresentar uma grande portabilidade para lC, ser simples, robusta e flexível, pequena e portátil. Ela também é utilizada no controle de Inteligência Artificial (NPCs), aparência de efeitos e elementos gráficos, controles lógicos, controles de debug em tempo real e interfaces. Construtores - declarações e comandos Convençoes léxicas Os Nomes, em Lua, são chamados de identificadores e podem ser qualquer cadeia de letras, digitos, e sublinhados que não comecem com um digito. Ela também utiliza como palavras reservadas and, end, in, repeat, break, false, local, return, do, for, nil, then, else, function, not , true, elseif, if, or, until e while. Além disso, essa linguagem diferencia palavras minúsculas de maiúsculas e nomes que começam como um sublinhado seguido por letras maiúsculas são reservados para variáveis globais internas. Ela apresenta também outros itens léxicos como +, -, *, /, %, ^, #, , ~=, <=, >=, <, >, =, (, ), {,}, ,, ;, :, ., .., ... Suas cadeias de caracteres literais podem ser aspas simples ou aspas duplas, e podem conter sequências de escape semelhantes a do C. Já o comentário começa com um hífen duplo (--) em qualquer lugar, desde que fora da cadei de caracteres. Valores e Tipos Lua é uma linguagem dinamicamente tipada, ou seja, somentes valores possuem tipos, não existindo a definição de tipo na linguagem. Uma de suas grandes caracteristicas e que influenciam na sua legibilidade e capacidade de escrita é que todos os seus valores podem ser armazenados em variáveis, passados como argumentos para outras funções e retornados como resultados. Tipos Lua possue oito tipos básicos, são eles: *Nil : Possui valor que é diferente de qualquer outro valor sendo usado quando há ausência de valor em determinada variavel. *Boolean : possui valores false e true. *Number : representa números reais (ponto flutuante e precisão dubla) *String : cadeias de caracteres *userdata : permite que dados C arbitrários possam ser armazenados em variáveis Lua. *Thread : representa fluxos de execução independentes e é usado para interpretar co-rotinas. Ela dá suporte a co-rotinas em todos os sistemas, até os que não dão suporte a processos leves. *Table : implementa array associativos, arrays que podem ser indexados não só por números, mas por qualquer valor exceto nil. Elas são heterogêneas Valores do tipo table, function, thread e userdata são objetos e por isso suas variáveis não contêm seus valores e sim apenas uma referência para eles. Valores Em lua existem as variáveis globais, locais e campos de tabelas Comandos Trechos Seguencia de comandos, os quais são executados sequenciamente. trecho ::= {comando [`';'´]} Blocos Lista de comandos. bloco ::= trecho Atribuição A linguagem permite multiplas atribuições, por isso a sintaxe para atribuição define uma lista de variáveis no lado esquerdo e uma lista de expressões na lado direito. comando ::= listavar `=´ listaexp listavar ::= var {`,´ var} listaexp ::= exp {`,´ exp} Estruturas de controle As estruturas if, while e repeat tem sintaxe familiar. comando ::= while exp do bloco end comando ::= repeat bloco until exp comando ::= if exp then bloco {elseif exp then bloco} bloco end O comando return é usado para retornar valores da função ou trecho de código. Já o break é usado para terminar a execução de um laço. Comando for O for genérico funciona por meio de funções chamadas iteradoreas. Cada uma é chamada para produzir um novo valor. Assim: comando ::= for listadenomes in listaexp do bloco end listadenomes ::= Nome {`,´ Nome} Chamada de Função como Comandos As funções em lua podem ser executadas como comandos comando ::= chamadadefuncao Operadores Aritiméticos Ela provem os operadores usuais e (+) adição, (-) subtração, (*) multiplicação, (\) divisão, (%) módulo. Operadores lógicos São and, or e not 10 or 20 --> 10 10 or error() --> 10 nil or "a" --> "a" nil and 10 --> nil false and error() --> false false and nil --> false false or nil --> nil 10 and 20 --> 20 Concatenação É denotado por ('..') Construtores de Tabelas Construtores de tabelas são expressões que criam tabelas. Toda vez que um construtor é avaliado, uma nova tabela é criada. A sintaxe geral de construtores é: construtortabela ::= `{´ listadecampos `}´ listadecampos ::= campo {separadordecampos campo} separadordecampos campo ::= `exp `´ `=´ exp | Nome `=´ exp | exp separadordecampos ::= `,´ | `;´ Ambientes Além de metatabelas, objetos do tipo thread, function e userdata possuem outra tabela associada com eles, chamada de seu ambiente. Assim como metatabelas, ambientes são tabelas normais e vários objetos podem compartilhar o mesmo ambiente. Objetos do tipo thread são criados compartilhando o ambiente da thread que os criou. Objetos do tipo userdata e funções C são criados compartilhando o ambiente da função C que os criou. Garbage Colector Lua realiza gerenciamento automático da memória. Isto significa que você não precisa se preocupar com a alocação de memória para novos objetos nem com a liberação de memória quando os objetos não são mais necessários. Legibilidade Simplicidade Geral Seus programas podem ser lidos e entedidos facilmente. Isso é um requisito para manutenção de um programa. Além disso, para trabalhar com tipos de dados estruturados como array, matriz, registro e tabelas hash temos um unico tipo: o table. Seus comentarios são feitos por dois hifens e os programas em lua podem ser interpretados de maneira fácil, o que viabiliza a sua legibilidade. Ortogonalidade Conceito que esta embutido na legibilidade e está relacionado com a simplicidade. Dessa forma, quanto mais ortogonal é um programa, menos excessões vão existir. O tipo table pode receber um array prenchido com valores de tipos diferentes. Entretanto quando é imprimido mostra apenas o endereço da tabela. Isso acontece porque o tipo table representa um objeto e não armazena valores e sim uma referência a ela mesmo. Diferente de C, Lua consegue ter como membro de uma estrutura qualquer tipo de dado inclusive na estrutura de mesmo tipo Estrutura de controle É simples e muito parecida com as linguagens de uso comercial. Seus detalhes estão listados acima. Tipos de dados e estruturas Possui oito tipos básicos listados em valores e tipos, mais acima. Sintaxe Possui um sintaxe 'enxuta', possuindo recursos parecidos com as demais linguagens. Seus detalhes estão listados logo acima. Diante dos criterios avaliados podemos concluir que Lua é uma linguagem que lebilidade Capacidade de escrita Lua é uma linguagem que possui expressividade, já que pode representar várias computações por meio de uma única expressão. Como no exemplo a seguir: n = io.read ( “*number” ) -- n recebe um número de entrada tab = {1, 3, nil } table.insert(tab.n) -- insere n na última posição da tabela table.insert(tab.n) --insere n na última posição da tabela print ( tab4 ) -- exibe o quarto valor da tabela, que representa o n Confiabilidade Possui verificação de tipos durante o tempo de execução, além de tratar erros por meio da manipulação de excessões. Seus erros também são bem comportados, como segue o exemplo: function IFoundTheBug() a = "" print(a..b) end function myError() cError = pcall(IFoundTheBug) end function Call_1() error(cError, 1) end myError() Call_1 Exemplos O Programa Olá Mundo pode ser escrito da seguinte forma: print "Olá, Mundo!" A função fatorial recursiva: function fact(n) if n 0 then return 1 else return n * fact(n - 1) end end O cálculo dos n primeiros números primos: function perfeitos(n) cont=0 x=0 print('Os numeros perfeitos sao ') repeat x=x+1 soma=0 for i=1,(x-1) do if math.mod(x,i) 0 then soma=soma+i; end end if soma x then print(x) cont = cont+1 end until cont n print('Pressione qualquer tecla para finalizar...') end O tratamento das funções como variáveis de primeira classe é mostrado no exemplo a seguir, onde o comportamento da função “print” é modificado: do local oldprint = print -- Grava a variável “print” em “oldprint” print = function(s) -- Redefine a função “print” if s "foo" then oldprint("bar") else oldprint(s) end end end Benchmarking Os testes foram realizados em um Ubuntu: Intel Q6600 x86 one core. Foram utilizados 11 algoritmos distintos e medidos o processamento, memoria, tamanha do código e retardo. Lua vs Perl.png|Lua vs Perl Lua vs Perl Lua vs Python.png|Lua vs Python Lua vs Python Lua vs Ruby.png|Lua vs Ruby Lua vs Ruby